package com.xxxtea.common;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * 通用API响应结果封装类
 * 
 * 用于统一接口返回结构，包含数据、消息、状态码等字段。
 * 支持成功、失败、带数据等多种静态工厂方法，便于前后端交互。
 * 
 * @param <T> 响应数据类型
 * @author badman
 * @since 1.0.0
 */
@Data
@ApiModel("服务端响应数据")
public class Result<T> {
	/** 响应数据 */
	@ApiModelProperty("数据")
	private T data;
	/** 错误信息或提示消息 */
	@ApiModelProperty("错误信息")
	private String msg;
	/** 状态码：1成功，0和其它数字为失败 */
	@ApiModelProperty("编码：1成功，0和其它数字为失败")
	private Integer code;

	/**
	 * 返回成功响应（无数据）
	 * @param <T> 泛型
	 * @return Result对象
	 */
	public static <T> Result<T> success() {
		Result<T> r = new Result<>();
		r.msg = "OK";
		r.code = 1;
		return r;
	}

	/**
	 * 返回成功响应（带数据）
	 * @param object 数据
	 * @param <T> 泛型
	 * @return Result对象
	 */
	public static <T> Result<T> success(T object) {
		Result<T> r = new Result<>();
		r.data = object;
		r.msg = "OK";
		r.code = 1;
		return r;
	}

	/**
	 * 返回失败响应（自定义状态码和消息）
	 * @param code 状态码
	 * @param msg 错误信息
	 * @param <T> 泛型
	 * @return Result对象
	 */
	public static <T> Result<T> error(Integer code, String msg) {
		Result<T> r = new Result<>();
		r.msg = msg;
		r.code = code;
		return r;
	}

	/**
	 * 返回失败响应（默认状态码0）
	 * @param msg 错误信息
	 * @param <T> 泛型
	 * @return Result对象
	 */
	public static <T> Result<T> error(String msg) {
		Result<T> r = new Result<>();
		r.msg = msg;
		r.code = 0;
		return r;
	}
}